嵌入式Linux下移植Mp3播放器

您所在的位置:网站首页 linux 播放m3u8 嵌入式Linux下移植Mp3播放器

嵌入式Linux下移植Mp3播放器

2023-08-31 16:44| 来源: 网络整理| 查看: 265

核心板要播放mp3不是说简单就简单的事情

首先应该确定板子上的音频通道是好的。至少能够播放wav吧

 

准备工作: 看下网上资料,想想MP3是有版权的,肯定是需要是解码库的解码库什么合适?这些解码库,肯定是可以下载,由于考虑到核心板,肯定也需要源码能够进行交叉编译

 

先是漫无目的搜索,想到Qt是不是可以播放,Python是不是可以。现实是残酷的,了解到的Qt,Python都是实现接口部分,并不解决解码库的问题。反正一句话,就是要先有解码库才可以。

搜索一会,把问题集中到一起了。Linux下Mp3解码库 libmad,madplay是鼎鼎大名的播放器。

 

既然,确定目标了,那么就解决解码库的事情。Baidu,madplay,一堆东西,也有很多好的文章,看样子很多人在研究,相信肯定有戏。先找个写得详细点入手吧。

 

解码库,基本上用的以下三种文件,如果系统没有装过,都需要先下载安装的

zlib-1.2.3.tar.tar用于文件的压缩和解压libid3tag-0.15.1b.tar.gz mp3的解码库libmad-0.15.1b.tar.gz madplay的库文件madplay-0.15.2b.tar.gz 播放程序的压缩包,mp3播放器的源码 准备工作的插曲

(插曲:)既然,自己的编译的。自然想到先在Ubuntu试验下,结果,发现本人的虚拟机下Ubuntu的竟然没有声音,播放wav,也没声音(这个到一直没有发现这个问题。突然发现,觉得很奇怪)。

进入系统设置的声音设置,发现是静音的,但怎么修改不行,都是静音的,是很奇怪。(windows下从来没碰到过问题)

后来,看网上资料,说可以先看有没有设备。 “aplay -l”

竟然,没找到硬件设备列表。说明驱动没有装好。原来Ubuntu要装alsa的声音驱动。

 

先卸载原先的alsa

sudo apt-get remove linux-sound-base alsa-base alsa-utils

sudo apt-get install xmlto libasound2-dev

sudo apt-get install linux-sound-base alsa-base alsa-utils

下载 一个lib  alsa-lib-1.0.25.tar.bz2   //这个不是最新的,但不是最新就最好,要自己匹配的,我就装过好几个版本,能装上去,但无效。

后来,发现Ubuntu 14.04,装这个版本是可以用的。。。因此,就选这个版本。可能其他版本可能也能用。

安装 alsa-lib-1.0.25.tar.bz2。先解压

./configure

Make

Make install

 

 

   Alsa驱动重新装了,“aplay -l”可以看到设备列表了,以为这样就可以了,小激动了下。结果事实是残酷的,仍然是静音,仍然没有声音!!!!

 

         继续百度,找原因。。。。

 

         说用“alsamixer”可以调节声音的,于是,就输入了,弹出一个类似窗口的输入,修改,每个选项都改80以上。

        

 

         以为这样就可以了,小激动了下。结果事实是残酷的,仍然是静音,仍然没有声音!!!!

 

         继续百度,果然真理掌握少数人手里,看以下帖子,恍然大悟

         https://blog.csdn.net/guodongxiaren/article/details/25700619

 

好了,到此为止Ubuntu终于可以输出声音,至少播放wav是ok的了。

 

 

继续来折腾MP3解码库的事情。

Ubuntu下编译MP3解码库

首先是Ubuntu下的编译,即x86版本:

 zlib-1.2.3.tar.tar用于文件的压缩和解压libid3tag-0.15.1b.tar.gz mp3的解码库libmad-0.15.1b.tar.gz madplay的库文件madplay-0.15.2b.tar.gz 播放程序的压缩包,mp3播放器的源码

 

ps:这几个库在Ubuntu下安装,问题不多,网上很多文章都写的很清楚,有些问题也写了七七八八的。但原则,还是不要看一篇文章走到底,一般是不行的,多综合其他文章来看,当然碰到过钉子,才知道集众家之长的好处。

 

 

zlib编译,安装

# tar -zxvf zlib-1.2.3.tar.gz         解压

进入解压的目录,输入:“/usr/local/lib/mad_x86”是指存放目录

./configure --prefix=/usr/local/lib/mad_x86

 

然后,make

然后,make install

 

---这个是基本没碰到什么问题,一切顺利

 

libid3tag编译

# tar -zxvf libid3tag-0.15.1b.tar.gz      解压

进入解压的目录,输入:

./configure --prefix=/usr/local/lib/mad_x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_x86/include LDFLAGS=-L/usr/local/lib/mad_x86/lib

 

然后,make

然后,make install

 

---这个是基本没碰到什么问题,一切顺利

 

libmad 编译

# tar -zxvf libmad-0.15.1b.tar.gz 

进入解压的目录,输入:

 

./configure --prefix=/usr/local/lib/mad_x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_x86/include LDFLAGS=-L/usr/local/lib/mad_x86/lib

 

然后打开Makefile,找到"-fforce-mem"它并删除 (否则会报错)

 

然后,make

然后,make install

 

---这个是基本没碰到什么问题,一切顺利(除了-fforce-mem错误)

 

madplay 编译:

# tar -zxvf madplay-0.15.2b.tar.gz 解压

 

进入解压的目录,输入:

 

./configure --prefix=/opt/madplayer --with-alsa --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_x86/include LDFLAGS=-L/usr/local/lib/mad_x86/lib

 

然后,make

然后,make install

 

----ps,网上帖子大部分不是这样,一般都是缺少“--with-alsa”的,这样编译什么的都ok的,但播放的时候会提示“audio: /dev/dsp: 没有那个文件或目录”,在Ubuntu也可以解决的。例如:

解决方法:

 

在当前目录下敲上两条命令:

 

1 mknod /dev/dsp c 14 3

 

2 chmod 666 /dev/dsp

 

如果敲了以上两条命令还提示/dev/dsp:没有这个设备(可能系统已经不支持oss的)

 

可以继续执行如下命令:(在CentOS7 下,以下两条命令是不行的,所以此方法在CentOs 7下是无效的)

 

3 modprobe snd-pcm-oss

 

4 modprobe snd-mixer-oss

 

 

 

         这个解决办法不好,每次重启之后,又得重新这样设置下,否则仍然会提示错误的。

 

         原因,madplay默认是走oss的,但Ubuntu14 是用alsa的,所以不对的。

 

         当然,最佳的解决就是添加“--with-alsa”这个编译参数

 

好了,如果你的Ubuntu下,安装正常alsa跟以上编译过程,肯定没有问题。

 

交叉编译---ARM版本的mp3解码库

由于arm核心板,已经带了alsa的驱动(在核心板上敲“aplay -l”,看看有没有设备列表出来。如果有的话,就说明ok的,否则要先移植alsa库),这里就不重复alsa的移植了,事实上网上也有很多资料。

当然,首先Ubuntu也是要安装好交叉编译环境,arm-linux编译环境要安装好。

 

套路上,还是跟x86的一致:

zlib-1.2.3.tar.tar用于文件的压缩和解压libid3tag-0.15.1b.tar.gz mp3的解码库libmad-0.15.1b.tar.gz madplay的库文件madplay-0.15.2b.tar.gz 播放程序的压缩包,mp3播放器的源码

 

zlib编译,安装

# tar -zxvf zlib-1.2.3.tar.gz         解压(重新搞个文件夹进行解压,不要跟原先x86重复了。后面的操作都是一样)

 

cd到解压之后的目录,输入:“/usr/local/lib/mad_arm”是指存放目录(是arm)

./configure --prefix=/usr/local/lib/mad_arm

 

此时,会生成MakeFile文件,打开zlib-1.2.3目录下的Makefile文件,按以下内容修改并保存:(主要意思是把默认编译器改成arm-linux)

 

CC=arm-linux-gcc

 

LDSHARED=arm-linux-gcc

 

CPP=arm-linux-gcc -E

 

AR=arm-linux-ar rc

 

RANLIB=arm-linux-ranlib

 

然后,make

然后,make install

 

---这个是基本没碰到什么问题,一切顺利

 

 

libid3tag编译

# tar -zxvf libid3tag-0.15.1b.tar.gz      解压

cd到解压之后的目录,输入:

./configure --host=arm-linux CC=arm-linux-gcc --prefix=/usr/local/lib/mad_arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_arm/include LDFLAGS=-L/usr/local/lib/mad_arm/lib

 

然后,make

然后,make install

 

---这个是基本没碰到什么问题,一切顺利

 

 

libmad 编译

# tar -zxvf libmad-0.15.1b.tar.gz 

cd到解压之后的目录,输入:

 

./configure --host=arm-linux CC=arm-linux-gcc --prefix=/usr/local/lib/mad_arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_arm/include LDFLAGS=-L/usr/local/lib/mad_arm/lib

 

然后打开Makefile,找到"-fforce-mem"它并删除 (否则会报错)

 

然后,make

然后,make install

 

---这个是基本没碰到什么问题,一切顺利(除了-fforce-mem错误)

 

(/usr/local/lib/mad_arm/lib,这个目录下的所有文件都要拷贝到核心板 /lib 下)

 

 

madplay 编译:

# tar -zxvf madplay-0.15.2b.tar.gz 解压

 

cd到解压之后的目录,输入:

./configure --host=arm-linux CC=arm-linux-gcc --prefix=/opt/madplayarm --with-alsa=/usr/share/bluetooth/lib --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/lib/mad_arm/include LDFLAGS=-L/usr/local/lib/mad_arm/lib

 

这里需要说明的是

--with-alsa=/usr/share/bluetooth/lib 是我的alsa arm版编译存放路径

 

然后,make

 

如果需要静态编译,需要加上:

#arm-linux-gcc -Wall -g -O2 -o madplay *.o  -L/usr/local/lib/mad_arm/lib -lid3tag  -lmad  -lz -lm -static

 

然后,make install

 

----ps,网上帖子大部分不是这样,一般都是缺少“--with-alsa”的,这样编译什么的都ok的,但播放的时候会提示“audio: /dev/dsp: 没有那个文件或目录”,在Ubuntu也可以解决的。

        因此,解决办法只能是添加“--with-alsa”这个编译参数

 

测试播放:

Up.mp3为要测试的mp3文件

 

以下为测试命令:

system("./madplay -o wav:- Up.mp3 | aplay &");     //播放

system(“./madplay -r -o wav:- Up.mp3 | aplay &”);     //循环播放:参数-r

system("killall -9 madplay");                                           //利用system函数调用killall命令将madplay终止掉 

system("killall -STOP madplay &");            //利用system函数调用killall命令将madplay暂停

system("killall -CONT madplay &");            //利用system函数调用killall命令恢复madplay的播放

 

./madplay -v --start=0:1:20.11 -o wav:- Up.mp3 | aplay &

 

这里要说明下,有个坑,在Ubuntu下,直接这样可以的

./madplay Up.mp3

 

 

./madplay Up.mp3 -o tt.wav  Up.mp3 转成 tt.wav

 

但在arm板子上是不行的,仍然提示“/dev/dsp:没有这个设备”,一开始一直以为编译的时候没有添加“--with-alsa”,实际是添加的。

 

后来才知道,要添加参数“./madplay -o wav:- Up.mp3 | aplay”才可以的。这个很难能够想到的,是个坑。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3